/**
 * 用户模型定义
 *
 * 该模块定义了用户表的结构和属性，使用Sequelize库进行数据库操作。
 * 用户表包含了一系列用户相关信息，如身份标识、联系方式、个人信息等。
 *
 * @module User
 * @property {string} id 用户唯一标识，使用UUID生成。
 * @property {string} openid 小程序用户唯一标识，可为空。
 * @property {string} phone_number 用户手机号，唯一且不允许为空。
 * @property {string} password 用户密码，可为空。
 * @property {string} avatar_url 用户头像URL地址，可为空。
 * @property {number} user_type 用户类型，整数表示，可为空。
 * @property {number} user_level 用户等级，整数表示，可为空。
 * @property {string} nickname 用户昵称，可为空。
 * @property {string} email 用户邮箱，可为空。
 * @property {number} gender 用户性别，整数表示，可为空。
 * @property {string} birth_date 用户生日，字符串表示，可为空。
 * @property {number} province 用户所在省份，整数表示，可为空。
 * @property {number} city 用户所在城市，整数表示，可为空。
 * @property {number} district 用户所在区县，整数表示，可为空。
 * @property {string} address 用户详细地址，可为空。
 * @property {string} ip_address 用户本次登录的IP地址，可为空。
 * @property {string} points 用户积分，可为空。
 * @property {string} bio 用户个人简介，可为空。
 */
const { DataTypes } = require("sequelize");

const requelize = require("../db/sequelize");
/**
 * 定义用户模型类
 *
 * 该类代表了数据库中的用户表，包括表的结构和各种属性的定义。
 * 使用Sequelize的define方法来创建模型。
 */
const User = requelize.define(
  "db_user",
  {
    id: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
      unique: true,
      primaryKey: true,
      comment: "ID",
    },
    openid: {
      type: DataTypes.STRING(128),
      allowNull: true,
      comment: "小程序用户唯一标识",
    },
    phone_number: {
      type: DataTypes.STRING(11),
      allowNull: false,
      unique: true,
      comment: "手机号",
    },
    password: {
      type: DataTypes.STRING(64),
      allowNull: true,
      comment: "密码",
    },
    avatar_url: {
      type: DataTypes.STRING,
      allowNull: true,
      comment: "头像URL地址",
    },
    user_type: {
      type: DataTypes.INTEGER(2),
      allowNull: true,
      comment: "用户类型",
    },
    user_level: {
      type: DataTypes.INTEGER(2),
      allowNull: true,
      comment: "用户等级",
    },
    nickname: {
      type: DataTypes.STRING(20),
      allowNull: true,
      comment: "昵称",
    },
    email: {
      type: DataTypes.STRING,
      allowNull: true,
      comment: "邮箱",
    },
    gender: {
      type: DataTypes.INTEGER(4),
      allowNull: true,
      comment: "性别",
    },
    birth_date: {
      type: DataTypes.STRING,
      allowNull: true,
      comment: "生日",
    },
    province: {
      type: DataTypes.INTEGER(6),
      allowNull: true,
      comment: "省",
    },
    city: {
      type: DataTypes.INTEGER(6),
      allowNull: true,
      comment: "市",
    },
    district: {
      type: DataTypes.INTEGER(6),
      allowNull: true,
      comment: "区",
    },
    address: {
      type: DataTypes.STRING(64),
      allowNull: true,
      comment: "详细地址",
    },
    ip_address: {
      type: DataTypes.STRING(128),
      allowNull: true,
      comment: "本次登录IP地址",
    },
    last_login_time: {
      type: DataTypes.DATE,
      allowNull: true,
      comment: "上次登录时间",
    },
    points: {
      type: DataTypes.STRING,
      allowNull: true,
      comment: "积分",
    },
    bio: {
      type: DataTypes.TEXT,
      allowNull: true,
      comment: "个人简介",
    },
  },
  {
    tableName: "db_user",
    comment: "用户表",
  }
);
// 注释掉的代码块：这里原本是一个同步数据库表结构的调用，使用时需要解除注释并谨慎操作，因为它会强制同步表结构，可能导致数据丢失
// User.sync({ alter: true });

// 导出用户模型，供其他模块使用
module.exports = User;
